Docker 清理卫士

本文对释放 Docker 占的磁盘,网络,数据卷的命令做一个整理。内容部分来自网络,一部分来自自己的总结。

Volumn

来自 chadoe/docker-cleanup-volumes

清理所有没有打标签的 volume:

1
$ docker volume rm $(docker volume ls -qf dangling=true)

或:

1
$ docker volume ls -qf dangling=true | xargs -r docker volume rm

Networks

列出本机创建的所有 network:

1
$ docker network ls
1
$ docker network ls | grep "bridge"
1
$ docker network rm $(docker network ls | grep "bridge" | awk '/ / { print $1 }')

Images

来自 how-to-remove-old-and-unused-docker-images

1
2
$ docker images
$ docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
1
2
$ docker images | grep "none"
$ docker rmi $(docker images | grep "none" | awk '/ / { print $3 }')

Containers

来自 how-to-remove-old-and-unused-docker-images

删除所有已经退出的容器

1
$ docker rm $(docker ps -qa --no-trunc --filter "status=exited")

1
docker rm `docker ps -a | grep -i 'exited' | awk {'print $1'}`

内置命令

1.13.0版本开始,docker 引入了 docker system prune 命令,可以用来清理主机的磁盘空间。该命令可以一键清理所有已停止的容器;所有未被容器引用的 volume(dangling volume);所有未被容器引用的网络;所有 dangling 的镜像。命令执行完后可以看到释放的空间的大小。

1
docker system prune

如果要移除所有未被使用的镜像(不仅仅是 dangling 的),可以使用

1
docker system prune -a

dangling 的镜像的定义是未被其他镜像引用的镜像,如果构建了新的镜像,但该镜像没有被打上一个新的标签,那么之前打了这个标签的镜像就是 dangling 镜像,它的 name 属性是 none。总的来说,如果一个镜像与任何一个打上标签的镜像没有关联,它就是 dangling 镜像。如果镜像的 repository 和 tag 都是 none,称为 intermediate 镜像。

prune 方法的实现在 https://github.com/moby/moby/blob/master/daemon/prune.go 里,有兴趣的话可以看看这个方法的实现。

清理镜像

1
docker image prune

k8s 的 PodGC

Garbage Collection

Reference